﻿using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
using MagicTraderLib.Schema;

namespace MagicTraderLib
{
    public enum Soortuitvoer
    {
        Csv = 1,
        Linkjes = 2
    };

    public class CollectieVergelijker
    {
        private readonly Verzameling _mijn;
        private readonly Verzameling _zijn;

        public CollectieVergelijker(int mijnId, int zijnId)
        {
            _mijn = new Verzameling(mijnId);
            _zijn = new Verzameling(zijnId);
        }

        public CollectieVergelijker(Verzameling mijn, Verzameling zijn)
        {
            _mijn = mijn;
            _zijn = zijn;
        }

        public void Export(string exportDirectory = @"c:\temp\", Soortuitvoer uitvoer = Soortuitvoer.Linkjes)
        {
            var kaarten1 = Vergelijk(_mijn.Kaarten.Where(i => i.AantalWants >= 1), _zijn.Kaarten.Where(i => i.AantalHaves >= 1));
            var kaarten2 = Vergelijk(_zijn.Kaarten.Where(i => i.AantalWants >= 1), _mijn.Kaarten.Where(i => i.AantalHaves >= 1));

            var hij = _zijn.LidNr;

            var extentie = (uitvoer == Soortuitvoer.Linkjes ? "txt" : "csv");
            var pad1 = Path.Combine(exportDirectory, hij.ToString(CultureInfo.InvariantCulture) + " HijVoormij." + extentie);
            var pad2 = Path.Combine(exportDirectory, hij.ToString(CultureInfo.InvariantCulture) + " IkVoorHem." + extentie);
            
            // als ruil mogelijk...
            //if (kaarten1.Any() && kaarten2.Any())
            //{
            //    if (kaarten1.Sum(p => p.TotaalPrijs) <= kaarten2.Sum(p => p.TotaalPrijs))
            //    {
                    WritetoFile(kaarten1, pad1, uitvoer, true);
                    WritetoFile(kaarten2, pad1, uitvoer, false);
            //    }
            //}
        }

        private IEnumerable<Result> Vergelijk(IEnumerable<Kaart> mijn, IEnumerable<Kaart> zijn)
        {
            var kaarten = new List<Result>();
            foreach (var kaart in mijn)
            {
                Kaart zijnkaart = zijn.FirstOrDefault(i => NaamSetFoilZijnGelijk(i, kaart));

                if (zijnkaart != null)
                    kaarten.Add(new Result(kaart, zijnkaart));
            }
            return kaarten;
        }

        private static bool NaamSetFoilZijnGelijk(Kaart i, Kaart kaart)
        {
            return i.Naam.Equals(kaart.Naam) && i.Set.Equals(kaart.Set) && i.Foil.Equals(kaart.Foil);
        }

        private void WritetoFile(IEnumerable<Result> kaarten, string file, Soortuitvoer uitvoer, bool overwrite = true)
        {
            if (overwrite)
            {
                File.Delete(file);
            }
            const string sep = ";";

            string [] headers =
            {
                "Zijn Wants"
                , "Mijn Haves"
                , "Totaal"
                , "Naam"
                , "Set"
                , "Kleur"
                , "Rarety"
                , "Prijs per stuk"
                , "Prijs Totaal"
                , "zijn Foil"
                , "mijn Foil"
            };

            string koptekst = String.Join(sep, headers);

            var lines = new List<string>();
            lines.Add(koptekst);
            
            lines.AddRange(kaarten.OrderByDescending(i => i.Mijn.Set)
                                  .ThenByDescending(i=>i.Mijn.Prijs)
                                  .Select(i => uitvoer == Soortuitvoer.Linkjes ? i.Output_PPLinks() : i.Output_Excel())
                          );

            lines.Add(String.Format("totaal {0}", kaarten.Sum(i => i.TotaalPrijs)));

            File.AppendAllLines(file, lines, Encoding.GetEncoding("ISO-8859-1"));
        }
    }
}